/* Copyright (c) Microsoft Corporation.
   Licensed under the MIT License. */

/* Copyright (c) Microsoft Corporation.
   Licensed under the MIT License. */

/***************************************************************************

	Main include file for the help authoring tool.

***************************************************************************/
#ifndef CHELP_H
#define CHELP_H

#include "kidframe.h"
#include "chelpexp.h"
#include "chelpres.h"

extern PSTRG vpstrg;
extern SC_LID vsclid;
extern PSPLC vpsplc;

enum
	{
	khidLigButton = khidLimFrame,
	khidLigPicture,
	};

//creator type for the help editor
#define kctgChelp 'CHLP'

typedef class LID *PLID;
typedef class LIG *PLIG;
typedef class HETD *PHETD;

/***************************************************************************
	App class
***************************************************************************/
#define APP_PAR APPB
#define kclsAPP 'APP'
class APP : public APP_PAR
	{
	RTCLASS_DEC
	ASSERT
	MARKMEM
	CMD_MAP_DEC(APP)

protected:
	PCRM _pcrm;
	PLID _plidPicture;
	PLID _plidButton;

	virtual bool _FInit(ulong grfapp, ulong grfgob, long ginDef);
	virtual void _FastUpdate(PGOB pgob, PREGN pregnClip,
		ulong grfapp = fappNil, PGPT pgpt = pvNil);

public:
	virtual void GetStnAppName(PSTN pstn);
	virtual void UpdateHwnd(HWND hwnd, RC *prc, ulong grfapp = fappNil);

	virtual bool FCmdOpen(PCMD pcmd);
	virtual bool FCmdLoadResFile(PCMD pcmd);
	virtual bool FCmdChooseLanguage(PCMD pcmd);
	virtual bool FEnableChooseLanguage(PCMD pcmd, ulong *pgrfeds);

	PLIG PligNew(bool fButton, PGCB pgcb, PTXHD ptxhd);
	bool FLoadResFile(PFNI pfni);
	bool FOpenDocFile(PFNI pfni, long cid = cidOpen);
	};
extern APP vapp;


/***************************************************************************
	List document
***************************************************************************/
#define LID_PAR DOCB
#define kclsLID 'LID'
class LID : public LID_PAR
	{
	RTCLASS_DEC
	ASSERT
	MARKMEM

protected:
	struct CACH
		{
		PCRF pcrf;
		CNO cno;
		CNO cnoMbmp;
		};

	PCRM _pcrm;		// where to look for the chunks
	CTG _ctg;		// what ctg to look for
	CHID _chid;		// what chid value the MBMP should be at (if _ctg is not MBMP)
	PGL _pglcach;	// list of the chunks that we found

	LID(void);
	~LID(void);

	bool _FInit(PCRM pcrm, CTG ctg, CHID chid);

public:
	static PLID PlidNew(PCRM pcrm, CTG ctg, CHID chid = 0);

	bool FRefresh(void);
	long Ccki(void);
	void GetCki(long icki, CKI *pcki, PCRF *ppcrf = pvNil);
	PMBMP PmbmpGet(long icki);
	};


/***************************************************************************
	List display gob
***************************************************************************/
const long kdxpCellLig = kdzpInch * 2;
const long kdypCellLig = kdzpInch;

typedef class LIG *PLIG;
#define LIG_PAR DDG
#define kclsLIG 'LIG'
class LIG : public LIG_PAR
	{
	RTCLASS_DEC
	ASSERT
	MARKMEM
	CMD_MAP_DEC(LIG)

protected:
	PTXHD _ptxhd;	// the document to put the chunk in
	PSCB _pscb;		// our scroll bar
	long _dypCell;	// how tall are our cells

	LIG(PLID plid, GCB *pgcb);
	bool _FInit(PTXHD ptxhd, long dypCell);

public:
	static PLIG PligNew(PLID plid, GCB *pgcb, PTXHD ptxhd,
		long dypCell = kdypCellLig);

	PLID Plid(void);
	void Refresh(void);
	virtual void MouseDown(long xp, long yp, long cact, ulong grfcust);
	virtual void Draw(PGNV pgnv, RC *prcClip);
	virtual bool FCmdScroll(PCMD pcmd);
	};


/***************************************************************************
	Color chooser GOB.
***************************************************************************/
const long kcacrCcg = 8;
const long kdxpCcg = 78;
const long kdxpFrameCcg = 2;

typedef class CCG *PCCG;
#define CCG_PAR GOB
#define kclsCCG 'CCG'
class CCG : public CCG_PAR
	{
	RTCLASS_DEC
	ASSERT

protected:
	PTXHD _ptxhd;		// the document to put the color in
	long _cacrRow;		// how many colors to put on a row
	bool _fForeColor;	// whether this sets the foreground or background color

	bool _FGetAcrFromPt(long xp, long yp, ACR *pacr, RC *prc = pvNil,
		long *piscr = pvNil);

public:
	CCG(GCB *pgcb, PTXHD ptxhd, bool fForeColor, long cacrRow = kcacrCcg);

	virtual void MouseDown(long xp, long yp, long cact, ulong grfcust);
	virtual void Draw(PGNV pgnv, RC *prcClip);
	virtual bool FCmdMouseMove(PCMD_MOUSE pcmd);

	virtual bool FEnsureToolTip(PGOB *ppgobCurTip, long xpMouse, long ypMouse);
	};


/***************************************************************************
	Color chooser tool tip.
***************************************************************************/
typedef class CCGT *PCCGT;
#define CCGT_PAR GOB
#define kclsCCGT 'CCGT'
class CCGT : public CCGT_PAR
	{
	RTCLASS_DEC

protected:
	ACR _acr;
	STN _stn;

public:
	CCGT(PGCB pgcb, ACR acr = kacrBlack, PSTN pstn = pvNil);

	void SetAcr(ACR acr, PSTN pstn = pvNil);
	ACR AcrCur(void)
		{ return _acr; }

	virtual void Draw(PGNV pgnv, RC *prcClip);
	};


/***************************************************************************
	Help editor doc - consists of a CFL containing (possibly) multiple
	topics.
***************************************************************************/
typedef class HEDO *PHEDO;
#define HEDO_PAR DOCB
#define kclsHEDO 'HEDO'
class HEDO : public HEDO_PAR
	{
	RTCLASS_DEC
	ASSERT

protected:
	PCFL _pcfl;		//the chunky file
	PRCA _prca;		//the resources

	HEDO(void);
	~HEDO(void);

public:
	static PHEDO PhedoNew(FNI *pfni, PRCA prca);

	PCFL Pcfl(void)
		{ return _pcfl; }
	PRCA Prca(void)
		{ return _prca; }
	virtual PDDG PddgNew(PGCB pgcb);
	virtual bool FGetFni(FNI *pfni);
	virtual bool FGetFniSave(FNI *pfni);
	virtual bool FSaveToFni(FNI *pfni, bool fSetFni);

	virtual void InvalAllDdg(CNO cno);
	virtual bool FExportText(void);
	virtual void DoFindNext(PHETD phetd, CNO cno, bool fAdvance = fTrue);

	virtual PHETD PhetdOpenNext(PHETD phetd);
	virtual PHETD PhetdOpenPrev(PHETD phetd);
	};


/***************************************************************************
	TSEL: used to track a selection in a chunky file doc
***************************************************************************/
#define TSEL_PAR BASE
#define kclsTSEL 'TSEL'
class TSEL : public TSEL_PAR
	{
	RTCLASS_DEC
	ASSERT

protected:
	PCFL _pcfl;
	long _icki;
	CNO _cno;

	void _SetNil(void);

public:
	TSEL(PCFL pcfl);

	void Adjust(void);

	long Icki(void) { return _icki; }
	CNO Cno(void) { return _cno; }

	bool FSetIcki(long icki);
	bool FSetCno(CNO cno);
	};


/***************************************************************************
	Help editor document display GOB - displays a HEDO.
***************************************************************************/
typedef class HEDG *PHEDG;
#define HEDG_PAR DDG
#define kclsHEDG 'HEDG'
class HEDG : public HEDG_PAR
	{
	RTCLASS_DEC
	CMD_MAP_DEC(HEDG)
	ASSERT

protected:
	long _onn;				//fixed width font to use
	long _dypHeader;		//height of the header
	long _dypLine;			//height of one line
	long _dxpChar;			//width of a character
	long _dypBorder;		//height of border (included in _dypLine)
	PCFL _pcfl;				//the chunky file
	TSEL _tsel;				//the selection

	HEDG(PHEDO phedo, PCFL pcfl, PGCB pgcb);
	virtual void _Scroll(long scaHorz, long scaVert,
		long scvHorz = 0, long scvVert = 0);
	virtual void _ScrollDxpDyp(long dxp, long dyp);

	long _YpFromIcki(long icki)
		{ return LwMul(icki - _scvVert, _dypLine) + _dypHeader; }
	long _XpFromIch(long ich)
		{ return LwMul(ich - _scvHorz + 1, _dxpChar); }
	long _IckiFromYp(long yp);
	void _GetContent(RC *prc);

	void _DrawSel(PGNV pgnv);
	void _SetSel(long icki, CNO cno = cnoNil);
	void _ShowSel(void);
	void _EditTopic(CNO cno);

	virtual void _Activate(bool fActive);
	virtual long _ScvMax(bool fVert);

	//clipboard support
	virtual bool _FCopySel(PDOCB *ppdocb = pvNil);
	virtual void _ClearSel(void);
	virtual bool _FPaste(PCLIP pclip, bool fDoIt, long cid);

	#ifdef WIN
		void _StartPage(PGNV pgnv, PSTN pstnDoc, long lwPage,
			RC *prcPage, long onn);
	#endif //WIN

public:
	static PHEDG PhedgNew(PHEDO phedo, PCFL pcfl, PGCB pgcb);

	virtual void Draw(PGNV pgnv, RC *prcClip);
	virtual void MouseDown(long xp, long yp, long cact, ulong grfcust);
	virtual bool FCmdKey(PCMD_KEY pcmd);

	virtual void InvalCno(CNO cno);
	virtual bool FEnableHedgCmd(PCMD pcmd, ulong *pgrfeds);
	virtual bool FCmdNewTopic(PCMD pcmd);
	virtual bool FCmdEditTopic(PCMD pcmd);
	virtual bool FCmdDeleteTopic(PCMD pcmd);
	virtual bool FCmdExport(PCMD pcmd);
	virtual bool FCmdFind(PCMD pcmd);
	virtual bool FCmdPrint(PCMD pcmd);
	virtual bool FCmdCheckSpelling(PCMD pcmd);
	virtual bool FCmdDump(PCMD pcmd);

	PHEDO Phedo(void)
		{ return (PHEDO)_pdocb; }
	};


/***************************************************************************
	Help editor topic doc - for editing a single topic in a HEDO.
	An instance of this class is a child doc of a HEDO.
***************************************************************************/
#define HETD_PAR TXHD
#define kclsHETD 'HETD'
class HETD : public HETD_PAR
	{
	RTCLASS_DEC
	ASSERT
	MARKMEM

protected:
	PCFL _pcfl;		//which chunk is being edited
	CNO _cno;
	PGST _pgst;		//string versions of stuff in HTOP
	STN _stnDesc;	//description

	HETD(PDOCB pdocb, PRCA prca, PCFL pcfl, CNO cno);
	~HETD(void);

	virtual bool _FReadChunk(PCFL pcfl, CTG ctg, CNO cno, bool fCopyText);

public:
	static PHETD PhetdNew(PDOCB pdocb, PRCA prca, PCFL pcfl, CNO cno);
	static PHETD PhetdFromChunk(PDOCB pdocb, CNO cno);
	static void CloseDeletedHetd(PDOCB pdocb);

	virtual PDMD PdmdNew(void);
	virtual PDDG PddgNew(PGCB pgcb);
	virtual void GetName(PSTN pstn);
	virtual bool FSave(long cid);

	virtual bool FSaveToChunk(PCFL pcfl, CKI *pcki, bool fRedirectText = fFalse);

	void EditHtop(void);
	bool FDoFind(long cpMin, long *pcpMin, long *pcpLim);
	bool FDoReplace(long cp1, long cp2, long *pcpMin, long *pcpLim);

	PHEDO Phedo(void)
		{ return (PHEDO)PdocbPar(); }
	CNO Cno(void)
		{ return _cno; }

	void GetHtopStn(long istn, PSTN pstn);
	};


/***************************************************************************
	DDG for an HETD.  Help text document editing gob.
***************************************************************************/
typedef class HETG *PHETG;
#define HETG_PAR TXRG
#define kclsHETG 'HETG'
class HETG : public HETG_PAR
	{
	RTCLASS_DEC
	CMD_MAP_DEC(HETG)

protected:
	HETG(PHETD phetd, PGCB pgcb);

	// clipboard support
	virtual bool _FCopySel(PDOCB *ppdocb = pvNil);

	// override these so we can put up our dialogs
	virtual bool _FGetOtherSize(long *pdypFont);
	virtual bool _FGetOtherSubSuper(long *pdypOffset);

	// we have our own ruler
	virtual long _DypTrul(void);
	virtual PTRUL _PtrulNew(PGCB pgcb);

	// override _DrawLinExtra so we can put boxes around grouped text.
	virtual void _DrawLinExtra(PGNV pgnv, PRC prcClip, LIN *plin,
		long dxp, long yp, ulong grftxtg);

public:
	static PHETG PhetgNew(PHETD phetd, PGCB pgcb);

	virtual void InvalCp(long cp, long ccpIns, long ccpDel);

	virtual void Draw(PGNV pgnv, RC *prcClip);
	virtual bool FInsertPicture(PCRF pcrf, CTG ctg, CNO cno);
	virtual bool FInsertButton(PCRF pcrf, CTG ctg, CNO cno);

	virtual bool FCmdGroupText(PCMD pcmd);
	virtual bool FCmdFormatPicture(PCMD pcmd);
	virtual bool FCmdFormatButton(PCMD pcmd);
	virtual bool FEnableHetgCmd(PCMD pcmd, ulong *pgrfeds);
	virtual bool FCmdEditHtop(PCMD pcmd);
	virtual bool FCmdInsertEdit(PCMD pcmd);
	virtual bool FCmdFormatEdit(PCMD pcmd);
	virtual bool FCmdFind(PCMD pcmd);
	virtual bool FCmdPrint(PCMD pcmd);
	virtual bool FCmdLineSpacing(PCMD pcmd);
	virtual bool FCmdNextTopic(PCMD pcmd);
	virtual bool FCmdCheckSpelling(PCMD pcmd);
	virtual bool FCmdFontDialog(PCMD pcmd);

	virtual bool FCheckSpelling(long *pcactChanges);

	PHETD Phetd(void)
		{ return (PHETD)_ptxtb; }

	long DypLine(long ilin);
	};


const long kstidFind = 1;
const long kstidReplace = 2;


/***************************************************************************
	The ruler for a help text document.
***************************************************************************/
typedef class HTRU *PHTRU;
#define HTRU_PAR TRUL
#define kclsHTRU 'HTRU'
class HTRU : public HTRU_PAR
	{
	RTCLASS_DEC
	ASSERT

protected:
	//ruler track type
	enum
		{
		rttNil,
		krttTab,
		krttDoc
		};

	PTXTG _ptxtg;
	long _dxpTab;
	long _dxpDoc;
	long _dyp;
	long _xpLeft;
	long _dxpTrack;
	long _rtt;
	long _onn;
	long _dypFont;
	ulong _grfont;

	HTRU(GCB *pgcb, PTXTG ptxtg);

public:
	static PHTRU PhtruNew(GCB *pgcb, PTXTG ptxtg, long dxpTab, long dxpDoc,
		long dypDoc, long xpLeft, long onn, long dypFont, ulong grfont);

	virtual void Draw(PGNV pgnv, RC *prcClip);
	virtual bool FCmdTrackMouse(PCMD_MOUSE pcmd);

	virtual void SetDxpTab(long dxpTab);
	virtual void SetDxpDoc(long dxpDoc);
	virtual void SetXpLeft(long xpLeft);

	virtual void SetDypHeight(long dyp);
	};

#endif //!CHELP_H

